package cn.yto.print.service.handle;

import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.ptr.IntByReference;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

public interface HCNetSDK extends Library {

    /*String currentWorkingDir = System.getProperty("user.dir");
    HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(currentWorkingDir+"\\YTO_BusiGateway\\exp_server\\HCNetSDK.dll",
            HCNetSDK.class);*/


        public class HIKSDKStructure extends Structure {
                protected List<String> getFieldOrder(){
                        List<String> fieldOrderList = new ArrayList<String>();
                        for (Class<?> cls = getClass();
                             !cls.equals(HIKSDKStructure.class);
                             cls = cls.getSuperclass()) {
                                Field[] fields = cls.getDeclaredFields();
                                int modifiers;
                                for (Field field : fields) {
                                        modifiers = field.getModifiers();
                                        if (Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
                                                continue;
                                        }
                                        fieldOrderList.add(field.getName());
                                }
                        }
                        return fieldOrderList;
                }
        }



        public static final int NET_DVR_DEV_ADDRESS_MAX_LEN = 129;
        public static final int NET_DVR_LOGIN_USERNAME_MAX_LEN = 64;
        public static final int SERIALNO_LEN = 48;   //序列号长度
        public static final int MAX_STRINGNUM_V30 = 8;        //9000设备最大OSD字符行数数
        public static final int NET_DVR_LOGIN_PASSWD_MAX_LEN = 64;
        public static final int NET_DVR_GET_SHOWSTRING_V30 = 1030;
        public static final int NET_DVR_SET_SHOWSTRING_V30 = 1031;
        public static final int NET_DVR_CHECK_USER_STATUS = 20005; //检测设备是否在线

        boolean NET_DVR_Init();
        boolean NET_DVR_Logout(int lUserID);
        int NET_DVR_Login_V40(NET_DVR_USER_LOGIN_INFO pLoginInfo, NET_DVR_DEVICEINFO_V40 lpDeviceInfo);
        int NET_DVR_GetLastError();
        boolean NET_DVR_GetDVRConfig(int lUserID, int dwCommand, int lChannel, Pointer lpOutBuffer, int dwOutBufferSize, IntByReference lpBytesReturned);
        boolean NET_DVR_SetDVRConfig(int lUserID, int dwCommand, int lChannel, Pointer lpInBuffer, int dwInBufferSize);




        //NET_DVR_Login_V40()参数
        public static class NET_DVR_USER_LOGIN_INFO extends HIKSDKStructure {
                public byte[] sDeviceAddress = new byte[NET_DVR_DEV_ADDRESS_MAX_LEN];
                public byte byUseTransport;
                public short wPort;
                public byte[] sUserName = new byte[NET_DVR_LOGIN_USERNAME_MAX_LEN];
                public byte[] sPassword = new byte[NET_DVR_LOGIN_PASSWD_MAX_LEN];
                public FLoginResultCallBack cbLoginResult;
                public Pointer pUser;
                public boolean bUseAsynLogin;
                public byte byProxyType; //0:不使用代理，1：使用标准代理，2：使用EHome代理
                public byte byUseUTCTime;    //0-不进行转换，默认,1-接口上输入输出全部使用UTC时间,SDK完成UTC时间与设备时区的转换,2-接口上输入输出全部使用平台本地时间，SDK完成平台本地时间与设备时区的转换
                public byte byLoginMode; //0-Private 1-ISAPI 2-自适应
                public byte byHttps;    //0-不适用tls，1-使用tls 2-自适应
                public int iProxyID;    //代理服务器序号，添加代理服务器信息时，相对应的服务器数组下表值
                public byte byVerifyMode;  //认证方式，0-不认证，1-双向认证，2-单向认证；认证仅在使用TLS的时候生效;
                public byte[] byRes2 = new byte[119];
        }

        //NET_DVR_Login_V40()参数
        public static class NET_DVR_DEVICEINFO_V40 extends HIKSDKStructure {
                public NET_DVR_DEVICEINFO_V30 struDeviceV30 = new NET_DVR_DEVICEINFO_V30();
                public byte bySupportLock;
                public byte byRetryLoginTime;
                public byte byPasswordLevel;
                public byte byRes1;
                public int dwSurplusLockTime;
                public byte byCharEncodeType;//字符编码类型：0- 无字符编码信息(老设备)，1- GB2312(简体中文)，2- GBK，3- BIG5(繁体中文)，4- Shift_JIS(日文)，5- EUC-KR(韩文)，6- UTF-8，7- ISO8859-1，8- ISO8859-2，9- ISO8859-3，…，依次类推，21- ISO8859-15(西欧)
                public byte bySupportDev5; //支持v50版本的设备参数获取，设备名称和设备类型名称长度扩展为64字节
                public byte bySupport;  //能力集扩展，位与结果：0- 不支持，1- 支持
                public byte byLoginMode; //登录模式 0-Private登录 1-ISAPI登录
                public int dwOEMCode;
                public int iResidualValidity;   //该用户密码剩余有效天数，单位：天，返回负值，表示密码已经超期使用，例如“-3表示密码已经超期使用3天”
                public byte byResidualValidity; // iResidualValidity字段是否有效，0-无效，1-有效
                public byte bySingleStartDTalkChan;    //独立音轨接入的设备，起始接入通道号，0-为保留字节，无实际含义，音轨通道号不能从0开始
                public byte bySingleDTalkChanNums;    //独立音轨接入的设备的通道总数，0-表示不支持
                public byte byPassWordResetLevel; //0-无效，1-管理员创建一个非管理员用户为其设置密码，该非管理员用户正确登录设备后要提示“请修改初始登录密码”，未修改的情况下，用户每次登入都会进行提醒；2-当非管理员用户的密码被管理员修改，该非管理员用户再次正确登录设备后，需要提示“请重新设置登录密码”，未修改的情况下，用户每次登入都会进行提醒。
                public byte bySupportStreamEncrypt;  //能力集扩展，位与结果：0- 不支持，1- 支持 bySupportStreamEncrypt & 0x1:表示是否支持RTP/TLS取流 bySupportStreamEncrypt & 0x2:  表示是否支持SRTP/UDP取流 bySupportStreamEncrypt & 0x4:  表示是否支持SRTP/MULTICAST取流
                public byte byMarketType;//0-无效（未知类型）,1-经销型，2-行业型
                public byte[] byRes2 = new byte[238];
        }


        //NET_DVR_Login_V30()参数结构
        public static class NET_DVR_DEVICEINFO_V30 extends HIKSDKStructure {
                public byte[] sSerialNumber = new byte[SERIALNO_LEN];  //序列号
                public byte byAlarmInPortNum;    //报警输入个数
                public byte byAlarmOutPortNum;   //报警输出个数
                public byte byDiskNum;           //硬盘个数
                public byte byDVRType;         //设备类型, 1:DVR 2:ATM DVR 3:DVS ......
                public byte byChanNum;         //模拟通道个数
                public byte byStartChan;      //起始通道号,例如DVS-1,DVR - 1
                public byte byAudioChanNum;    //语音通道数
                public byte byIPChanNum;     //最大数字通道个数，低位
                public byte byZeroChanNum;    //零通道编码个数 //2010-01-16
                public byte byMainProto;      //主码流传输协议类型 0-private, 1-rtsp,2-同时支持private和rtsp
                public byte bySubProto;        //子码流传输协议类型0-private, 1-rtsp,2-同时支持private和rtsp
                public byte bySupport;        //能力，位与结果为0表示不支持，1表示支持，
                public byte bySupport1;        // 能力集扩充，位与结果为0表示不支持，1表示支持
                public byte bySupport2; /*能力*/
                public short wDevType;              //设备型号
                public byte bySupport3; //能力集扩展
                public byte byMultiStreamProto;//是否支持多码流,按位表示,0-不支持,1-支持,bit1-码流3,bit2-码流4,bit7-主码流，bit-8子码流
                public byte byStartDChan;        //起始数字通道号,0表示无效
                public byte byStartDTalkChan;    //起始数字对讲通道号，区别于模拟对讲通道号，0表示无效
                public byte byHighDChanNum;        //数字通道个数，高位
                public byte bySupport4;        //能力集扩展
                public byte byLanguageType;// 支持语种能力,按位表示,每一位0-不支持,1-支持
                //  byLanguageType 等于0 表示 老设备
                //  byLanguageType & 0x1表示支持中文
                //  byLanguageType & 0x2表示支持英文
                public byte byVoiceInChanNum;   //音频输入通道数
                public byte byStartVoiceInChanNo; //音频输入起始通道号 0表示无效
                public byte bySupport5;
                public byte bySupport6;   //能力
                public byte byMirrorChanNum;    //镜像通道个数，<录播主机中用于表示导播通道>
                public short wStartMirrorChanNo;  //起始镜像通道号
                public byte bySupport7;   //能力
                public byte byRes2;        //保留
        }
        public static class NET_DVR_SHOWSTRINGINFO extends HIKSDKStructure {//单字符参数(子结构)
                public short wShowString;                // 预览的图象上是否显示字符,0-不显示,1-显示 区域大小704*576,单个字符的大小为32*32
                public short wStringSize;                /* 该行字符的长度，不能大于44个字符 */
                public short wShowStringTopLeftX;        /* 字符显示位置的x坐标 */
                public short wShowStringTopLeftY;        /* 字符名称显示位置的y坐标 */
                public byte[] sString = new byte[44];                /* 要显示的字符内容 */
        }

        //叠加字符(9000扩展)
        public static class NET_DVR_SHOWSTRING_V30 extends HIKSDKStructure {
                public int dwSize;
                public NET_DVR_SHOWSTRINGINFO[] struStringInfo = new NET_DVR_SHOWSTRINGINFO[MAX_STRINGNUM_V30];                /* 要显示的字符内容 */
        }



        public static interface FLoginResultCallBack extends Callback {
                public int invoke(int lUserID, int dwResult, NET_DVR_DEVICEINFO_V30 lpDeviceinfo, Pointer pUser);
        }

        public boolean NET_DVR_RemoteControl(Integer lUserID, int dwCommand, Pointer lpInBuffer, int dwInBufferSize);


    }


